package br.ufpb.di.ppgi.apresentacao.interceptors;

import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.ufpb.di.ppgi.apresentacao.SiteConfiguration;
import br.ufpb.di.ppgi.negocio.ServiceLocator;
import br.ufpb.di.ppgi.negocio.modelo.usuario.Usuario;
import br.ufpb.di.ppgi.negocio.modelo.usuario.UsuarioSessionInfo;

@Intercepts
public class ViewInterceptor implements Interceptor {

	private final Result result;
	private final SiteConfiguration siteConfiguration;
	private final HttpServletRequest request;
	private final UsuarioSessionInfo usuarioLogado;
	private final ServiceLocator services;
	
	public ViewInterceptor(Result result, SiteConfiguration siteConfiguration, HttpServletRequest request, UsuarioSessionInfo usuarioLogado, ServiceLocator services) {
		this.result = result;
		this.siteConfiguration = siteConfiguration;
		this.request = request;
		this.usuarioLogado = usuarioLogado;
		this.services = services;
	}
	
	@Override
	public boolean accepts(ResourceMethod method) {
		return true;
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
		result.include("siteConfiguration", siteConfiguration);
		result.include("base", SiteConfiguration.getBase(request));
		result.include("usuarioLogado", getUsuarioLogado());
		result.include("qtdPropostasPendentes", getQtdPropostasPendentes());
		result.include("qtdDefesasPendentes", getQtdDefesasPendentes());
		
		stack.next(method, resourceInstance);
	}
	
	
	private Usuario getUsuarioLogado() {
		return usuarioLogado != null && usuarioLogado.isLogged() ? usuarioLogado.getUsuario() : null;
	}
	
//	private Integer getQtdePendencias() {
//		return usuarioLogado != null && usuarioLogado.isLogged() ? services.forUsuario().qtdePendencias(usuarioLogado.getUsuario()) : null;
//	}
	
	private Integer getQtdPropostasPendentes() {
		return usuarioLogado != null && usuarioLogado.isLogged() ? services.forUsuario().qtdPropostasPendentes(usuarioLogado.getUsuario()) : null;
	}
	
	private Integer getQtdDefesasPendentes() {
		return usuarioLogado != null && usuarioLogado.isLogged() ? services.forUsuario().qtdDefesasPendentes(usuarioLogado.getUsuario()) : null;
	}
	

}
